package com.ia.aistream.manager.framework.redis;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author chenjunsheng
 */
public interface RedisHashManager {
    /**
     * 参考 HSET 命令
     *
     * @param key
     * @param field
     * @param value
     */
    void hset(String key, String field, Object value);

    /**
     * 当且仅当域 field 尚未存在于哈希表的情况下， 将它的值设置为 value 。
     *
     * @param key
     * @param field
     * @param value
     * @return
     */
    boolean hsetnx(String key, String field, Object value);

    /**
     * 返回哈希表中给定域的值。
     *
     * @param key
     * @param field
     * @return
     */
    <V> V hget(String key, String field, Class<V> clazz);

    /**
     * 检查给定域 field 是否存在于哈希表 hash 当中。
     *
     * @param key
     * @param field
     * @return
     */
    boolean hexists(String key, String field);

    /**
     * 删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。
     *
     * @param key
     * @param fields
     */
    void hdel(String key, Object... fields);

    /**
     * 返回哈希表 key 中域的数量。
     *
     * @param key
     * @return
     */
    Long hlen(String key);

    /**
     * 返回哈希表 key 中， 与给定域 field 相关联的值的字符串长度（string length）。
     *
     * @param key
     * @param field
     */
    Long hstrlen(String key, String field);

    /**
     * 为哈希表 key 中的域 field 的值加上增量 increment 。
     *
     * @param key
     * @param field
     * @param increment
     */
    Long hincrby(String key, String field, long increment);

    /**
     * 为哈希表 key 中的域 field 的值加上增量 increment 。
     *
     * @param key
     * @param field
     * @param increment
     */
    Double hincrbyfloat(String key, String field, double increment);

    /**
     * 设置多个值
     *
     * @param key
     * @param map
     */
    <V> void hmset(String key, Map<String, V> map);

    /**
     * 获取多个值
     *
     * @param fields
     * @return
     */
    <V> List<V> hmget(String key, Collection<String> fields, Class<V> clazz);

    /**
     * 返回哈希表 key 中的所有域。
     *
     * @param key
     * @return
     */
    Set<String> hkeys(String key);

    /**
     * 返回哈希表 key 中所有域的值。
     *
     * @param key
     * @return
     */
    <V> List<V> hvals(String key, Class<V> clazz);

    /**
     * 参考 HGETALL 命令
     *
     * @param key 哈希表名称
     * @return 哈希表 key 中，所有的域和值
     */
    <V> Map<String, V> hgetall(String key, Class<V> clazz);
}
